#include <stdio.h>
#include <stdlib.h>


#define MAX_stu 10

//  泛型  
//      泛 : 广泛  大众
//      型 : 数据类型


// 单个学生
typedef struct
{
    char name[128]; // 姓名
    char sex[5];    // 性别
    short id;       // 学号
    int age;        // 年龄
    int sco;        // 成绩
} stu_data;

// 一个班
typedef struct
{
    stu_data data[MAX_stu]; // 学生   20 代表 20 个座位
    int len;                // 记录学生人数
} stu_class;

int Cmp_func(const void * val_1, const void *val_2)
{
    stu_data s1 = *(stu_data * )val_1;
    
    // 问： 为啥这个要转换类型?

    stu_data s2 = *(stu_data * )val_2;

    return s1.sco - s2.sco;

}


/************************* 打印 *************************/   
void printf_Sql_List(stu_class *class)
{
    // 循环
    for (size_t i = 0; i < class->len; i++)
    {
        // 打印数据
        printf("name = %s sex = %s id = %d sco = %d age = %d \n",
               class->data[i].name, class->data[i].sex, class->data[i].id, class->data[i].age, class->data[i].sco);
    }
}


// 自己写一个冒泡排序
void bolo_sort(stu_data * data , int len)
{

}

int main(int argc, char const *argv[])
{
    // 创建一个 班级结构体
    stu_class stu = {
        // 学生数据初始化
        .data = {
            {"石昊", "男", 1, 18, 120},
            {"萧炎", "男", 2, 18, 110},
            {"牧尘", "男", 3, 18, 115},
            {"林动", "男", 4, 18, 113},
            {"韩立", "男", 5, 18, 105},
        },
        // 学生个数变量初始化
        .len = 5};

    qsort(stu.data , stu.len  , sizeof(stu.data[0]) , Cmp_func);

    printf_Sql_List(&stu);

    return 0;
}




/*
排序
需要
    数据        1 , 2 , 3 , 4 
    数据长度    4
本质
    比对大小 
    顺序排序
        当 A > B 则 与 A 换位
        当 A < B 则 不动
    逆序排序
        当 A > B 则 不动
        当 A < B 则 与 B 换位
    
        A > B    A - B  正数
        A < B    A - B  负数
        A == B   A - B  = 0
*/